#include <vector>
#include <memory>
#include <mysql/mysql.h>

class DatabasePool {
public:
    static DatabasePool& getInstance() {
        static DatabasePool instance;
        return instance;
    }

    MYSQL* getConnection() {
        std::lock_guard<std::mutex> lock(mutex_);
        if (connections_.empty()) {
            createConnection(); // 创建新连接
        }
        MYSQL* conn = connections_.back();
        connections_.pop_back();
        return conn;
    }

    void releaseConnection(MYSQL* conn) {
        std::lock_guard<std::mutex> lock(mutex_);
        connections_.push_back(conn);
    }

private:
    DatabasePool() {
        for (int i = 0; i < 5; ++i) {
            createConnection();
        }
    }

    void createConnection() {
        MYSQL* conn = mysql_init(nullptr);
        mysql_real_connect(conn, "localhost", "user", "password", "db", 0, nullptr, 0);
        connections_.push_back(conn);
    }

    ~DatabasePool() {
        for (auto& conn : connections_) {
            mysql_close(conn);
        }
    }

    std::vector<MYSQL*> connections_;
    std::mutex mutex_;
};

// 使用示例
// 3. 数据库连接池
// 场景：管理数据库连接，复用连接以减少开销。
// 特点：
// 预创建固定数量的连接，避免频繁创建 / 销毁开销。
// 通过线程安全的单例管理连接池。
int main() {
    MYSQL* conn = DatabasePool::getInstance().getConnection();
    // 执行SQL操作...
    DatabasePool::getInstance().releaseConnection(conn);
    return 0;
}

// 总结
// 场景	        单例优势	                        实现方式推荐
// 日志系统	    全局唯一输出，避免多实例冲突	    C++11 局部静态变量
// 配置管理	    统一配置存储，延迟加载	            饿汉式或懒汉式
// 连接池	    复用资源，控制并发连接数	        懒汉式 + 智能指针
// 线程池	    全局任务调度，资源复用	            C++11 局部静态变量
// 渲染引擎	    唯一硬件上下文，避免资源竞争	    饿汉式或懒汉式